package com.api.signature.auto.client.http;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.Method;
import cn.hutool.json.JSONUtil;
import com.api.signature.auto.client.config.SignConfigClient;
import com.api.signature.auto.client.spring.ApiClientSignContext;
import com.signature.auto.common.consts.ApiSignConst;
import com.signature.auto.common.util.SignUtil;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Map;

/**
 * @author Jerry
 * @date 2024-01-31 16:40
 * api签名客户端
 */
public class ApiSignClient {


    @Autowired
    private SignConfigClient signConfigClient;

    /**
     * Post 请求
     *
     * @param method 方法名称：/goods/getGoods
     * @param params 参数
     * @return 请求结果
     */
    public HttpResponse postRequest(String method, Map<String, Object> params) {
        return getHttpResponse(method, params, Method.POST, null);
    }

    /**
     * Post 请求
     *
     * @param method 方法名称
     * @param params 参数
     * @param token  令牌
     * @return 请求结果
     */
    public HttpResponse postRequest(String method, Map<String, Object> params, String token) {
        return getHttpResponse(method, params, Method.POST, token);
    }

    /**
     * Get 请求
     *
     * @param method 请求方法
     * @param params 参数
     * @return 请求结果
     */
    public HttpResponse getRequest(String method, Map<String, Object> params) {
        return getHttpResponse(method, params, Method.GET, null);
    }

    /**
     * Get 请求
     *
     * @param method 请求方法
     * @param params 参数
     * @param token  令牌
     * @return 请求结果
     */
    public HttpResponse getRequest(String method, Map<String, Object> params, String token) {
        return getHttpResponse(method, params, Method.GET, token);
    }

    /**
     * 获取请求结果
     *
     * @param method    请求方法
     * @param params    参数
     * @param reqMethod 请求方式
     * @param token
     * @return 请求结果
     */
    private HttpResponse getHttpResponse(String method, Map<String, Object> params, Method reqMethod, String token) {
        // 1. 创建HttpRequest对象 - 指定好 url 地址
        String url = signConfigClient.getBaseUrl() + method;
        HttpRequest httpRequest = new HttpRequest(url);
        // 2. 设置请求方式
        httpRequest.setMethod(reqMethod);
        // 3. 设置请求参数可通过 form表单方法设置
        // 补充其它参数
        SignUtil signUtil = ApiClientSignContext.getSignUtil();
        Map<String, Object> reqParams = signUtil.addSignParams(params, signConfigClient.getSecret());
        if (reqMethod == Method.POST) {
            httpRequest.contentType("application/json");
            httpRequest.body(JSONUtil.toJsonStr(reqParams));
        }
        if (reqMethod == Method.GET) {
            httpRequest.form(reqParams);
        }
        // 4. 设置请求头
        httpRequest.header(ApiSignConst.HEADER, token == null ? signConfigClient.getToken() : token);
        // 5. 执行请求，得到http响应类
        return httpRequest.execute();
    }


}
